/**
 * Kelas Point
 * @class Point
 * @file Point.h
 * @author Sambya
 * @date 8 Maret 2012
 */

#ifndef _Point_H_
#define	_Point_H_
#include <iostream>
using namespace std;

class Point {
public:

    /**
    * Konstruktor dari kelas point
    * 
    * @param x Absis (default:0)
    * @param y Ordinat (default:0)
    */
	Point(int x=0, int y=0);
	
    /**
    * Copy Konstruktor dari kelas point
    * 
    * @param orig Point original (reference ke Point)
    */
	Point(const Point& orig);
	
    /**
    * Destruktor dari kelas point 
    */
	virtual ~Point();
	
    /**
    * Assignment operator dari kelas Point
    * @param orig Point original (reference ke Point)
    * @return Reference ke Point (memungkinkan asssigment berantai)
    */
	Point& operator= (const Point& orig);

    /**
    * Setter dari kelas point
    * 
    * @param x Absis
    * @param y Ordinat
    */
	void setPoint (int x, int y);
	
    /**
    * Getter Absis
    * @return Absis dari Point
    */
	int getAbsis() const;
	
	/**
	 * Getter Ordinat
     * @return Ordinat dari Point
     */
	int getOrdinat() const;
	
	/**
	 * Output Stream untuk kelas point
	 * 
	 * @param stream Buffer stream output
	 * @param P Point P
	 * @return stream output untuk kelas Point
	 */
	friend ostream& operator<< (ostream& stream, const Point& P);
	
	/**
	 * Operator + untuk kelas Point
	 * menghasilkan (p1.x+p2.x,p1.y+p2.y)
	 * 
	 * @param p1 Point1
	 * @param p2 Point2
	 */
	friend Point operator+ (const Point& p1, const Point& p2);
	
	
	/**
	 * Operator - untuk kelas Point
	 * menghasilkan (p1.x-p2.x,p1.y-p2.y)
	 * @param p1 Point1
	 * @param p2 Point2
	 */
	friend Point operator- (const Point& p1, const Point& p2);
    
    /**
     * Operator perkalian terhadap kelas point
     * @param P Suatu Point
     * @param X Konstanta
     * @return Point(P.Absis*X,P.Ordinat*X)
     */
	friend Point operator* (const Point& P, int X); 
	
    /**
     * Operator perkalian terhadap kelas point
     * @param X Konstanta
     * @param P Suatu Point
     * @return Point(P.Absis*X,P.Ordinat*X)
     */
    friend Point operator* (int X, const Point& P);

    /**
     * Operator pembagian terhadap kelas point
     * @param P Suatu Point
     * @param X Konstanta
     * @return Point(P.Absis/X,P.Ordinat/X)
     */
    friend Point operator/ (const Point& P, int X);
    
    /**
     * Operator pembagian terhadap kelas point
     * @param X Konstanta
     * @param P Suatu Point
     * @return Point(P.Absis/X,P.Ordinat/X)
     */
	friend Point operator/ (int X, const Point& P);

    /**
     * Operator perkalian dot terhadap kelas point
     * @param P Suatu Point
     * @return Absis*P.Absis+Ordinat*P.Ordinat
     */
    int dot(const Point& P) const;
	
    /**
     * Operasi Mirror pada suatu Point
     * @param P1 Suatu Point
     * @param P2 Suatu Point
     * @return Mirror P1 terhadap P2
     */
    Point& Mirror(const Point& P1,const Point& P2) const;
	
private:
    int ordinat, absis;
    static int n_Point;

};

#endif	/* Point_H */
